package arlab.formulae

/**
 * Created by IntelliJ IDEA.
 * User: Eve
 * Date: 23.02.12
 * Time: 15:45
 * To change this template use File | Settings | File Templates.
 */

// Prädikat ist eine Formel, die einen Namen besitzt und aus mehreren verschiedenen Termen besteht
case class Predicate (name:String, terms: Term*) extends Formula  {

  //überschreibt normale toString Methode für Prädikate
  override  def toString()={
    name + "(" + terms.mkString(",") + ")"
  }
//im Predicate kommen nur Terme vor und in Termen können keine Quantoren vorkommem.Daher keine bound-Methode
  //gibt eine Liste zurück die Alle Funktionen mitsammt ihren Stelligkeiten zurückgibt.
  override def functions: Set[(String,Int)] = terms.foldLeft(Set((name, terms.length)):Set[(String,Int)]) {(total, n) => total ++ n.functions}

  //Hilfsfunktion für die Bestimmung der freien Variablen
  override def freeHelp(bound:Set[Variable]):Set[Variable] =
        terms.foldLeft(Set():Set[Variable]) {(total, n) => total ++ n.freeHelp(bound)}
 
  //substituiert alle Variablen aus der uebergebenen map         
  override def subst(sfn: Map[Variable, Term]): Formula =
     Predicate(name, terms.map(_.subst(sfn)):_*)  
}


